package com.dy.design_pattern_study.mediator_pattern.dome2;

import com.dy.design_pattern_study.mediator_pattern.dome2.impl.Iraq;
import com.dy.design_pattern_study.mediator_pattern.dome2.impl.USA;
import com.dy.design_pattern_study.mediator_pattern.dome2.impl.UnitedNationsSecurityCouncil;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-23
 * @Content 中介者模式（Mediator），
 * 用一个中介对象来封装一系列的对象交互。
 * 中介者使各对象不需要显式地相互引用，从而使其耦合松散，
 * 而且可以独立地改变它们之间的交互。
 * <p>
 * 简单的说：
 * 中介者模式就是，在有限的类中，让他们有一个可以交流的平台
 * 类似 微信的聊天窗口，聊天窗口是一个中介类，具体的对象，分别存在
 * 他们可以作为微信的 对象，在聊天窗口互相发送消息（目前暂时无法实现群聊功能）
 */
public class client {
    /*
        在什么时候使用？
        1.中介者模式很容易在系统中应用，也很容易在系统中误用。
        当系统出现了‘多对多’交互复杂的对象群时，不要急于使用中介者模式，
        而要先反思你的系统在设计上是不是合理

        2.中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合
        --重点在于复杂的交互

        3.以及想定制一个分布在多个类中的行为，而又不想生成太多的子类的场合
        --重点在于 分布在多个类中的行为
     */
    /*
        中介者模式的优缺点：
        1.中介者 UnitedNations 减少了
        国家之间的耦合，使得可以独立的改变和复用各个国家类 Country 和 中介类 UnitedNations

        2.由于把对象如何协作进行了抽象，将中介作为一个独立的概念并将其封装在一个对象中，
        这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来，也就是站在一个更宏观的角度去看待系统
        简单的说：
            就是把重点从独立对象转移到他们之间的交互上，在意他们怎么对话，
            而不是他们具体有哪些特征

        缺点：
        1.UnitedNationsSecurityCouncil的集中控制，
        导致了中介者 UnitedNations 的复杂。
        就会让中介者比 任意的 Country 都要复杂
     */

    public static void main(String[] args) {
        UnitedNationsSecurityCouncil unsc = new UnitedNationsSecurityCouncil();

        //设置中介
        USA c1 = new USA(unsc);
        Iraq c2 = new Iraq(unsc);

        //设置同事
        unsc.setColleague1(c1);
        unsc.setColleague2(c2);

        c1.declare("这包洗衣粉就是你们伊拉克研究反人类的化学试剂");
        c2.declare("扯淡，你的霸权终究会被毁灭！");
    }
}
